#ifndef CHATWINDOW_H
#define CHATWINDOW_H

#include <QWidget>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QThread>
#include <QListWidget>
#include <QFileDialog>
#include <QSizePolicy>

#include <QScrollArea>
#include <QScrollBar>
#include <QLabel>
#include <QTimer>

#include <QInputDialog>
#include <QTextStream>

#include <vector>
#include <string>

#include "ChatWorker.h"
#include "HistoryWorker.h"
#include "ListenAndSpeak.h"

#include "VoiceWorker.h"
#include "VoiceSpeakWorker.h"

#include "ConfigDialog.h"

using namespace std;

struct ModelStateAndTextBubble {
    QLabel* modelStates;
    QLabel* texxtBubble;
};


class ChatWindow : public QWidget
{
    Q_OBJECT

public:
    ChatWindow(QWidget *parent = nullptr);
    ~ChatWindow();

    void loadHistory();

signals:
    void sendToWorker(const QString &text);
    void switchToHistoryMode(const QString &path);
    void switchToOrdinaryMode();
    void startVoiceRecognition(); // 开始语音识别
    void startVoiceSpeak(const QString& text); // 开始语音合成

private slots:
    void sendMessage();
    void handleModelResponse(const QString &response);
    void handleHistoryItemClicked(QListWidgetItem *item);
    void handleNewChat();
    void handleHistoryChat();
    void handleVoiceInput();
    void handleRagButton();
    void handleVoiceResult(const QString& result);

private:
    ModelStateAndTextBubble addChatBubble(bool isUser);
    void addChatBubble(const QString &text, bool isUser);
    void clearChatBubbles();
    void loadSearchedFilses();

    QLabel* addBubble(bool isUser);
    QLabel* addAvatar(bool isUser);
    // void addTextToAvatar(QLabel* &avatar, QString text);
    void addTextToBubble(QLabel* &Bubble, QString text);
    void resetModelResponseState(QLabel* &modelResponseState); // 修改模型回复状态为“思考完成”
    void showListeningPopup(bool listenOrNoVoice); // 显示语音输入提示框

    std::pair<QString, QString> readConfig(const QString& filePath); // 读取配置文件

    void saveConfig(const QString& filePath, const QString& apiKey, const QString& secretKey); // 保存配置文件
    void detectConfig(QString pttConfigFilePath, QString ttpConfigFilePath);

private:
    QVBoxLayout *chatDisplay;
    QLineEdit *inputLine;
    QPushButton *sendButton;
    QPushButton *loadHistoryButton;
    QListWidget *historyList;

    QPushButton *newChatButton;
    QPushButton *voiceButton;
    QPushButton *ragButton;

    QListWidget *selectedFileList;

    QScrollArea *scrollArea; // 滚动区域
    QWidget *scrollWidget; //滚动区域内容
    QVBoxLayout *bubbleLayout; // 用于存储气泡的布局
    QList<QLabel *> chatBubbles; // 存储气泡的列表
    ModelStateAndTextBubble modelStateAndTextBubble; // 聊天气泡


    bool voiceFlag = false;
    bool ragFlag = false;

    QLabel* listeningPopup = nullptr; // 语音输入提示框
    QTimer* popupTimer = nullptr;



    void adjustComponentSizes()
    {
        // 设置新建聊天按钮的大小
        newChatButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
        newChatButton->setMinimumSize(200, 50); // 设置最小宽度和高度
        newChatButton->setStyleSheet("background-color:rgb(202, 217, 245); color: white;");

        // 设置历史记录列表的大小
        historyList->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
        historyList->setMinimumWidth(200);  // 设置最小宽度
        historyList->setMinimumHeight(350); // 设置最小高度

        // 设置检索到的相关文件列表的大小
        selectedFileList->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
        selectedFileList->setMinimumWidth(200);  // 设置最小宽度
        selectedFileList->setMinimumHeight(200); // 设置最小高度

        // 设置输入框的大小
        inputLine->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
        inputLine->setFixedHeight(30); // 设置固定高度

        // 设置rag按钮的大小
        ragButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
        ragButton->setFixedSize(40, 30); // 设置固定宽度和高度

        // 设置语音按钮的大小
        voiceButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
        voiceButton->setFixedSize(30, 30); // 设置固定宽度和高度

        // 设置发送按钮的大小
        sendButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
        sendButton->setFixedSize(80, 30); // 设置固定宽度和高度
        sendButton->setStyleSheet("background-color:rgb(89, 142, 241); color: white;");
    }

    QThread *workerThread;
    ChatWorker *worker;
    HistoryWorker *historyworker;
    ListenAndSpeak *voiceModule;
    string historyFilePath = "";
    vector<string> searchedFiles;

    // 语音识别线程
    QThread* voiceThread = nullptr;
    VoiceWorker* voiceWorker = nullptr;

    // 语音合成线程
    QThread* voiceSpeakThread = nullptr;
    VoiceSpeakWorker* voiceSpeakWorker = nullptr;

    // 配置文件路径
    QString pttConfigFilePath = "../configs/pcmToTextConfig.txt";
    QString ttpConfigFilePath = "../configs/textToPcmConfig.txt";
};

#endif // CHATWINDOW_H
